package com.apobates.forum.toro.tuple.strategy;

import org.apache.commons.lang3.tuple.Triple;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * ASF lang3 Triple集合映射策略
 *
 * @param <L> 左对象类型
 * @param <M> 中对象类型
 * @param <R> 右对象类型
 * @param <E> 左函数的参数类型
 */
@FunctionalInterface
public interface ManyTripleSupplyStrategy<L, M, R, E, U> {
    /**
     * 执行入口
     *
     * @param leftObjSetFun 左对象的供应函数
     * @param middleFun   中对象的查询函数
     * @param rightFun    右对象的查询函数
     * @param argumentMap 左对象与右对象的连接参数。key的取值参看:PairMapper.Argument的属性名称
     * @return 返回ASF Lang3 Triple集合
     */
    Collection<Triple<L, M, R>> apply(
            Supplier<Collection<L>> leftObjSetFun,
            Function<Collection<E>, Collection<M>> middleFun,
            Function<Collection<U>, Collection<R>> rightFun,
            Map<String, String> argumentMap);

}
